import java.util.Stack;

/**
 * Controla as entradas vindas da rede
 * @author matheus
 *
 *	Handshake entre servidor e cliente: servidor envia uma string e le uma string. Cliente le uma string e apos envia uma string
 *
 */
public class ThreadRede extends Thread {

	private ControllerServer servidor;
	private ControllerClient cliente;
	private Stack<Integer> args;
	public static final int CLIENTE = 0;
	public static final int SERVIDOR = 1;
	private String nome_recebido;
	
	//Construtor sem Ip, incicia como servidor, Envia a string do nome do jogador no handshake
	public ThreadRede(Stack<Integer> args, String nome){
		this.args = args;
		cliente = null;
		servidor = new ControllerServer(6013); //Cria um administrador de servidor
		this.enviaString(nome);
		nome_recebido = this.leString();
	}
	//Se chamar com o ip, entao eh cliente
	public ThreadRede(Stack<Integer> args, String nome, String ip){
		this.args = args;
		servidor = null;
		cliente = new ControllerClient(ip, 6013);
		System.out.println("Cliente lendo Hello");
		nome_recebido = this.leString();
		System.out.println("Done!");
		System.out.println("Cliente enviando Hello");
		this.enviaString(nome);
		System.out.println("Done!");
		
}

	
	
	
	//args com 0, sua vez de produzir
	private void produz(){
		//Sincronizado pela pilha de jogadas.
		synchronized (args) {
			try{
				//Caso seja a vez de ler da rede (args.peek == 0), e tenha so um valor na ilah de jogadas (identificador)
				if(args.peek() == 0 && args.size() == 1){
					//Le ou do servidor ou do cliente, dependendo do caso
					
					if(servidor == null)
					{
						args.push(cliente.readInt());
						args.push(cliente.readInt());
					}
					else
					{
						args.push(servidor.readInt());
						args.push(servidor.readInt());
					}
					args.notify(); //NOtifica que acabou
				}
				else{

					if(args.elementAt(0) == 1){ //Notificado se foi ativada indevidamente
						args.notify();
					}
					
				}

			}catch (Exception e) {}
		}
	}


	public void enviaInt(int i)
	{
		if(servidor == null)
		{
			cliente.writeInt(i);
		}
		else
			servidor.writeInt(i);
		
	}
	
	public void enviaString(String s)
	{
		if(servidor == null)
		{
			cliente.enviaString(s);
		}
		else
			servidor.enviaString(s);
		
	}
	
	public String leString()
	{
		if(servidor == null)
		{
			return cliente.leString();
		}
		else
			return servidor.leString();
		
	}
	
	public String getNome_recebido() {
		return nome_recebido;
	}
	
	@Override
	public void run(){		
		while(true){
			this.produz();	//FIca sempre tentando produzir alguma informacao
		}
	}
	
}
